package facade.Producto;

import java.sql.SQLException;
import java.util.List;

import dao.implementations.postgresql.Alumno.AlumnoDB;
import dao.implementations.postgresql.Gae.GaeDB;
import dao.implementations.postgresql.Producto.ProductoDB;
import dao.interfaces.Alumno.IAlumno;
import dao.interfaces.Gae.IGae;
import dao.interfaces.Producto.IProducto;
import dao.transferObjects.Gae.GaeTO;
import dao.transferObjects.Gae.ProductoTO;
import facade.FacadeBase;

public class FacadeProducto extends FacadeBase {

	public int evaluarProducto(ProductoTO producto){
		
		int resp = -1;
		this.connection.setAutoCommit(false);
		IProducto productoDB = new ProductoDB(this.connection.getConnection());
		IGae gaeDB = new GaeDB(this.connection.getConnection());
		IAlumno alumnoDB = new AlumnoDB(this.connection.getConnection());
		
		resp = productoDB.evaluarProducto(producto);
		
		//GAE: Actualizar nota? acorde al id del producto
		if(resp > 0)
			resp = gaeDB.asignarNotaProducto(producto.getNota(), producto.getId_gae(), producto.getRut_gae(), producto.getNumero_producto());
		else
			resp = -1;
		//GAE: Actualizar nota final
		if(resp > 0)
			resp = gaeDB.asignarNotaFinal(producto.getId_gae(), producto.getRut_gae());
		else
			resp = -1;

		//ALUMNO: Actualizar nota? acorde al id del producto
		if(resp > 0)
			resp = alumnoDB.asignarNotaProducto(producto.getNota(), producto.getId_gae(), producto.getRut_gae(), producto.getNumero_producto());
		else
			resp = -1;
		
		//ALUMNO: Actualizar nota final
		if(resp > 0)
			resp = alumnoDB.asignarNotaFinal(producto.getId_gae(), producto.getRut_gae());
		else
			resp = -1;
		
		if(resp > 0){
			this.connection.commit();
		}else{
			this.connection.rollback();
		}
		
		try{
			this.connection.getConnection().close();
		}catch (SQLException e){
			e.printStackTrace();
		}
		return resp;
	}
	
	public int crearProducto(ProductoTO producto) {
		
		int resp = -1;
		
		IProducto productoDB = new ProductoDB(this.connection.getConnection());
		
		resp = productoDB.crearProducto(producto);
		
		try{
			this.connection.getConnection().close();
		}catch (SQLException e){
			e.printStackTrace();
		}
		return resp;
	}


	public int modificarProducto(ProductoTO producto) {

		return 0;
	}


	public int eliminarProducto(ProductoTO producto, GaeTO gae) {
		int resp = -1;
		int aux = 0;
		List<ProductoTO> listaProductosGae = null;
		this.connection.setAutoCommit(false);
		
		
		IProducto productoDB = new ProductoDB(this.connection.getConnection());
		
		listaProductosGae = productoDB.obtenerProductosGae(gae);
		
		if(listaProductosGae!=null)
		{
			for(int i=0;i<listaProductosGae.size();i++)
			{
				if(producto.getNumero_producto() < listaProductosGae.get(i).getNumero_producto()){
					listaProductosGae.get(i).setNumero_producto(listaProductosGae.get(i).getNumero_producto()-1);
					//Actualizamos su numero_reporte en la DB
					resp = productoDB.actualizarNumeroProducto(listaProductosGae.get(i));
					if(resp <= 0){
						resp=-1;
						break;
					}
					aux++;
				}
			}
		}
		
		if(resp > 0 || resp == -1 && aux == 0)
			resp = productoDB.eliminarProducto(producto);
		
		if(resp > 0){
			this.connection.commit();
		}else{
			this.connection.rollback();
		}
		try{
			this.connection.getConnection().close();
		}catch (SQLException e){
			e.printStackTrace();
		}
		return resp;
	}


	public int eliminarTodosProductosGae(GaeTO gae) {

		return 0;
	}
	
	public List<ProductoTO> obtenerProductosGae(GaeTO gae){
		List<ProductoTO> listaProductosGae = null;
		
		IProducto productoDB = new ProductoDB(this.connection.getConnection());
		
		listaProductosGae = productoDB.obtenerProductosGae(gae);
		
		try{
			this.connection.getConnection().close();
		}catch (SQLException e){
			e.printStackTrace();
		}
		return listaProductosGae;
	}
	
	public String obtenerPathProducto(int id_producto){
		String path = "";
		IProducto productoDB = new ProductoDB(this.connection.getConnection());
		
		path = productoDB.obtenerPathProducto(id_producto);
		
		try{
			this.connection.getConnection().close();
		}catch (SQLException e){
			e.printStackTrace();
		}
		return path;
	}

}
